package com.zp.reflection;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectTest3 {
	public Object copy(Object obj) throws Exception{
		Class<?> classType = obj.getClass();
		//构造方法参数为空:
		Constructor<?> c = classType.getConstructor(new Class[]{});
		Object instance = c.newInstance(new Object[]{});
		
		//下面结果说明instance 和 obj是Custom类的两个实例；
		System.out.println(instance == obj);
		System.out.println(instance instanceof Custom);
		System.out.println(obj instanceof Custom);
		
		//上面实例化的方式和此处一样；
//		Object instance = classType.newInstance();
		
		Field[] fields = classType.getDeclaredFields();
		
		for(Field field:fields){
			String name = field.getName();
			// 将属性的首字母转换为大写：name.substring(0, 1)获取第一个字母；
			String firstLetter = name.substring(0, 1).toUpperCase();
			//获取第一个字母之后的：name.substring(1)，括号内默认是左闭右开区间；
			String getMethodName = "get" + firstLetter + name.substring(1);
			String setMethodName = "set" + firstLetter + name.substring(1);

			Method getMethod = classType.getMethod(getMethodName,
					new Class[] {});
			//Field只有getType()方法：public Class<?> getType()；返回Class<?>类型；
			Method setMethod = classType.getMethod(setMethodName,
					new Class[] { field.getType() });
			
			System.out.println("field==="+field.getType());
			
			//obj这是传入参数的类型的实例，所有的反射方法和成员变量都obj的class对象产生的；
			//obj实例通过get方法将Custom创建对象时初始化的值得到；
			Object value = getMethod.invoke(obj, new Object[] {});
			//instance是类型的引用obj的Class对象产生的实例(即传入类型的实例)，和obj不同的Custom实例;
			//将obj实例的数据set到instance实例中，返回instance实例；
			setMethod.invoke(instance, new Object[] { value });
		}
		return instance;
	}
	
	public static void main(String[] args) throws Exception {
		Custom custom1 = new Custom("Tom", 20);
		custom1.setId(1);

		ReflectTest3 test = new ReflectTest3();
		
		//将obj实例的数据复制到instance实例中；
		Custom custom2 = (Custom) test.copy(custom1);

		System.out.println(custom2.getId() + "," + custom2.getName() + ","
				+ custom2.getAge());
	}
}


